﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace DataTools.Interop
{
    internal static class WndConst
    {
        #region Window Messages

        public const int  WM_NULL = 0x0;
        public const int  WM_CREATE = 0x1;
        public const int  WM_DESTROY = 0x2;
        public const int  WM_MOVE = 0x3;
        public const int  WM_SIZE = 0x5;

        public const int  WM_ACTIVATE = 0x6;

        public const int  WA_INACTIVE = 0;
        public const int  WA_ACTIVE = 1;
        public const int  WA_CLICKACTIVE = 2;

        public const int  WM_SETFOCUS = 0x7;
        public const int  WM_KILLFOCUS = 0x8;
        public const int  WM_ENABLE = 0xA;
        public const int  WM_SETREDRAW = 0xB;
        public const int  WM_SETTEXT = 0xC;
        public const int  WM_GETTEXT = 0xD;
        public const int  WM_GETTEXTLENGTH = 0xE;
        public const int  WM_PAINT = 0xF;
        public const int  WM_CLOSE = 0x10;
        public const int  WM_QUERYENDSESSION = 0x11;
        public const int  WM_QUERYOPEN = 0x13;
        public const int  WM_ENDSESSION = 0x16;
        public const int  WM_QUIT = 0x12;
        public const int  WM_ERASEBKGND = 0x14;
        public const int  WM_SYSCOLORCHANGE = 0x15;
        public const int  WM_SHOWWINDOW = 0x18;
        public const int  WM_WININICHANGE = 0x1A;
        public const int  WM_SETTINGCHANGE = WM_WININICHANGE;
        public const int  WM_DEVMODECHANGE = 0x1B;
        public const int  WM_ACTIVATEAPP = 0x1C;
        public const int  WM_FONTCHANGE = 0x1D;
        public const int  WM_TIMECHANGE = 0x1E;
        public const int  WM_CANCELMODE = 0x1F;
        public const int  WM_SETCURSOR = 0x20;
        public const int  WM_MOUSEACTIVATE = 0x21;
        public const int  WM_CHILDACTIVATE = 0x22;
        public const int  WM_QUEUESYNC = 0x23;
        public const int  WM_GETMINMAXINFO = 0x24;

        public const int  WM_PAINTICON = 0x26;
        public const int  WM_ICONERASEBKGND = 0x27;
        public const int  WM_NEXTDLGCTL = 0x28;
        public const int  WM_SPOOLERSTATUS = 0x2A;
        public const int  WM_DRAWITEM = 0x2B;
        public const int  WM_MEASUREITEM = 0x2C;
        public const int  WM_DELETEITEM = 0x2D;
        public const int  WM_VKEYTOITEM = 0x2E;
        public const int  WM_CHARTOITEM = 0x2F;
        public const int  WM_SETFONT = 0x30;
        public const int  WM_GETFONT = 0x31;
        public const int  WM_SETHOTKEY = 0x32;
        public const int  WM_GETHOTKEY = 0x33;
        public const int  WM_QUERYDRAGICON = 0x37;
        public const int  WM_COMPAREITEM = 0x39;
        public const int  WM_GETOBJECT = 0x3D;
        public const int  WM_COMPACTING = 0x41;
        public const int  WM_COMMNOTIFY = 0x44;
        public const int  WM_WINDOWPOSCHANGING = 0x46;
        public const int  WM_WINDOWPOSCHANGED = 0x47;

        public const int  WM_POWER = 0x48;

        public const int  PWR_OK = 1;
        public const int  PWR_FAIL = (-1);
        public const int  PWR_SUSPENDREQUEST = 1;
        public const int  PWR_SUSPENDRESUME = 2;
        public const int  PWR_CRITICALRESUME = 3;

        public const int  WM_COPYDATA = 0x4A;
        public const int  WM_CANCELJOURNAL = 0x4B;

        public const int  WM_NOTIFY = 0x4E;
        public const int  WM_INPUTLANGCHANGEREQUEST = 0x50;
        public const int  WM_INPUTLANGCHANGE = 0x51;
        public const int  WM_TCARD = 0x52;
        public const int  WM_HELP = 0x53;
        public const int  WM_USERCHANGED = 0x54;
        public const int  WM_NOTIFYFORMAT = 0x55;

        public const int  NFR_ANSI = 1;
        public const int  NFR_UNICODE = 2;
        public const int  NF_QUERY = 3;
        public const int  NF_REQUERY = 4;

        public const int  WM_CONTEXTMENU = 0x7B;
        public const int  WM_STYLECHANGING = 0x7C;
        public const int  WM_STYLECHANGED = 0x7D;
        public const int  WM_DISPLAYCHANGE = 0x7E;
        public const int  WM_GETICON = 0x7F;
        public const int  WM_SETICON = 0x80;
        public const int  WM_NCCREATE = 0x81;
        public const int  WM_NCDESTROY = 0x82;
        public const int  WM_NCCALCSIZE = 0x83;
        public const int  WM_NCHITTEST = 0x84;
        public const int  WM_NCPAINT = 0x85;
        public const int  WM_NCACTIVATE = 0x86;
        public const int  WM_GETDLGCODE = 0x87;
        public const int  WM_SYNCPAINT = 0x88;

        public const int  WM_NCMOUSEMOVE = 0xA0;
        public const int  WM_NCLBUTTONDOWN = 0xA1;
        public const int  WM_NCLBUTTONUP = 0xA2;
        public const int  WM_NCLBUTTONDBLCLK = 0xA3;
        public const int  WM_NCRBUTTONDOWN = 0xA4;
        public const int  WM_NCRBUTTONUP = 0xA5;
        public const int  WM_NCRBUTTONDBLCLK = 0xA6;
        public const int  WM_NCMBUTTONDOWN = 0xA7;
        public const int  WM_NCMBUTTONUP = 0xA8;
        public const int  WM_NCMBUTTONDBLCLK = 0xA9;

        public const int  WM_NCXBUTTONDOWN = 0xAB;
        public const int  WM_NCXBUTTONUP = 0xAC;
        public const int  WM_NCXBUTTONDBLCLK = 0xAD;

        public const int  WM_INPUT_DEVICE_CHANGE = 0xFE;
        public const int  WM_INPUT = 0xFF;
        public const int  WM_KEYFIRST = 0x100;
        public const int  WM_KEYDOWN = 0x100;
        public const int  WM_KEYUP = 0x101;
        public const int  WM_CHAR = 0x102;
        public const int  WM_DEADCHAR = 0x103;
        public const int  WM_SYSKEYDOWN = 0x104;
        public const int  WM_SYSKEYUP = 0x105;
        public const int  WM_SYSCHAR = 0x106;
        public const int  WM_SYSDEADCHAR = 0x107;
        public const int  WM_UNICHAR = 0x109;
        public const int  WM_KEYLAST = 0x109;
        public const int  UNICODE_NOCHAR = 0xFFFF;
        public const int  WM_IME_STARTCOMPOSITION = 0x10D;
        public const int  WM_IME_ENDCOMPOSITION = 0x10E;
        public const int  WM_IME_COMPOSITION = 0x10F;
        public const int  WM_IME_KEYLAST = 0x10F;
        public const int  WM_INITDIALOG = 0x110;
        public const int  WM_COMMAND = 0x111;
        public const int  WM_SYSCOMMAND = 0x112;
        public const int  WM_TIMER = 0x113;
        public const int  WM_HSCROLL = 0x114;
        public const int  WM_VSCROLL = 0x115;
        public const int  WM_INITMENU = 0x116;
        public const int  WM_INITMENUPOPUP = 0x117;
        public const int  WM_GESTURE = 0x119;
        public const int  WM_GESTURENOTIFY = 0x11A;
        public const int  WM_MENUSELECT = 0x11F;
        public const int  WM_MENUCHAR = 0x120;
        public const int  WM_ENTERIDLE = 0x121;
        public const int  WM_MENURBUTTONUP = 0x122;
        public const int  WM_MENUDRAG = 0x123;
        public const int  WM_MENUGETOBJECT = 0x124;
        public const int  WM_UNINITMENUPOPUP = 0x125;
        public const int  WM_MENUCOMMAND = 0x126;

        public const int  WM_CHANGEUISTATE = 0x127;
        public const int  WM_UPDATEUISTATE = 0x128;
        public const int  WM_QUERYUISTATE = 0x129;

        public const int  UIS_SET = 1;
        public const int  UIS_CLEAR = 2;
        public const int  UIS_INITIALIZE = 3;

        public const int  UISF_HIDEFOCUS = 0x1;
        public const int  UISF_HIDEACCEL = 0x2;

        public const int  UISF_ACTIVE = 0x4;

        public const int  WM_CTLCOLORMSGBOX = 0x132;
        public const int  WM_CTLCOLOREDIT = 0x133;
        public const int  WM_CTLCOLORLISTBOX = 0x134;
        public const int  WM_CTLCOLORBTN = 0x135;
        public const int  WM_CTLCOLORDLG = 0x136;
        public const int  WM_CTLCOLORSCROLLBAR = 0x137;
        public const int  WM_CTLCOLORSTATIC = 0x138;
        public const int  MN_GETHMENU = 0x1E1;

        public const int  WM_MOUSEFIRST = 0x200;
        public const int  WM_MOUSEMOVE = 0x200;
        public const int  WM_LBUTTONDOWN = 0x201;
        public const int  WM_LBUTTONUP = 0x202;
        public const int  WM_LBUTTONDBLCLK = 0x203;
        public const int  WM_RBUTTONDOWN = 0x204;
        public const int  WM_RBUTTONUP = 0x205;
        public const int  WM_RBUTTONDBLCLK = 0x206;
        public const int  WM_MBUTTONDOWN = 0x207;
        public const int  WM_MBUTTONUP = 0x208;
        public const int  WM_MBUTTONDBLCLK = 0x209;

        public const int  WM_MOUSEWHEEL = 0x20A;

        public const int  WM_XBUTTONDOWN = 0x20B;
        public const int  WM_XBUTTONUP = 0x20C;
        public const int  WM_XBUTTONDBLCLK = 0x20D;

        public const int  WM_MOUSEHWHEEL = 0x20E;

        public const int  WM_MOUSELAST = 0x20E;

        public const int  WHEEL_DELTA = 120;

        public static short GET_WHEEL_DELTA_WPARAM(IntPtr wParam) 
        {
            return (short)((int)wParam >> 16);
        }

        public const uint WHEEL_PAGESCROLL = UInt32.MaxValue;

        public static short GET_KEYSTATE_WPARAM(IntPtr wParam) 
        {
            return (short)((int)wParam & 0xFFFF);
        }

        public static short GET_NCHITTEST_WPARAM(IntPtr wParam) 
        {
            return (short)((int)wParam & 0xFFFF);
        }

        public static short GET_XBUTTON_WPARAM(IntPtr wParam) 
        {
           return (short)((int)wParam >> 16);
        }

        public const int  XBUTTON1 = 0x1;
        public const int  XBUTTON2 = 0x2;

        public const int  WM_PARENTNOTIFY = 0x210;
        public const int  WM_ENTERMENULOOP = 0x211;
        public const int  WM_EXITMENULOOP = 0x212;

        public const int  WM_NEXTMENU = 0x213;
        public const int  WM_SIZING = 0x214;
        public const int  WM_CAPTURECHANGED = 0x215;
        public const int  WM_MOVING = 0x216;

        public const int  WM_POWERBROADCAST = 0x218;

        public const int  PBT_APMQUERYSUSPEND = 0x0;
        public const int  PBT_APMQUERYSTANDBY = 0x1;

        public const int  PBT_APMQUERYSUSPENDFAILED = 0x2;
        public const int  PBT_APMQUERYSTANDBYFAILED = 0x3;

        public const int  PBT_APMSUSPEND = 0x4;
        public const int  PBT_APMSTANDBY = 0x5;

        public const int  PBT_APMRESUMECRITICAL = 0x6;
        public const int  PBT_APMRESUMESUSPEND = 0x7;
        public const int  PBT_APMRESUMESTANDBY = 0x8;

        public const int  PBTF_APMRESUMEFROMFAILURE = 0x1;

        public const int  PBT_APMBATTERYLOW = 0x9;
        public const int  PBT_APMPOWERSTATUSCHANGE = 0xA;

        public const int  PBT_APMOEMEVENT = 0xB;

        public const int  PBT_APMRESUMEAUTOMATIC = 0x12;

        public const int  PBT_POWERSETTINGCHANGE = 0x8013;

        [StructLayout(LayoutKind.Sequential)]
        public struct POWERBROADCAST_SETTING
        {
            public Guid PowerSetting;
            public uint DataLength;
            public byte Data;
        };

        public const int  WM_MDICREATE = 0x220;
        public const int  WM_MDIDESTROY = 0x221;
        public const int  WM_MDIACTIVATE = 0x222;
        public const int  WM_MDIRESTORE = 0x223;
        public const int  WM_MDINEXT = 0x224;
        public const int  WM_MDIMAXIMIZE = 0x225;
        public const int  WM_MDITILE = 0x226;
        public const int  WM_MDICASCADE = 0x227;
        public const int  WM_MDIICONARRANGE = 0x228;
        public const int  WM_MDIGETACTIVE = 0x229;

        public const int  WM_MDISETMENU = 0x230;
        public const int  WM_ENTERSIZEMOVE = 0x231;
        public const int  WM_EXITSIZEMOVE = 0x232;
        public const int  WM_DROPFILES = 0x233;
        public const int  WM_MDIREFRESHMENU = 0x234;

        public const int  WM_POINTERDEVICECHANGE = 0x238;
        public const int  WM_POINTERDEVICEINRANGE = 0x239;
        public const int  WM_POINTERDEVICEOUTOFRANGE = 0x23A;

        public const int  WM_TOUCH = 0x240;

        public const int  WM_NCPOINTERUPDATE = 0x241;
        public const int  WM_NCPOINTERDOWN = 0x242;
        public const int  WM_NCPOINTERUP = 0x243;
        public const int  WM_POINTERUPDATE = 0x245;
        public const int  WM_POINTERDOWN = 0x246;
        public const int  WM_POINTERUP = 0x247;
        public const int  WM_POINTERENTER = 0x249;
        public const int  WM_POINTERLEAVE = 0x24A;
        public const int  WM_POINTERACTIVATE = 0x24B;
        public const int  WM_POINTERCAPTURECHANGED = 0x24C;
        public const int  WM_TOUCHHITTESTING = 0x24D;
        public const int  WM_POINTERWHEEL = 0x24E;
        public const int  WM_POINTERHWHEEL = 0x24F;
        public const int  DM_POINTERHITTEST = 0x250;

        public const int  WM_IME_SETCONTEXT = 0x281;
        public const int  WM_IME_NOTIFY = 0x282;
        public const int  WM_IME_CONTROL = 0x283;
        public const int  WM_IME_COMPOSITIONFULL = 0x284;
        public const int  WM_IME_SELECT = 0x285;
        public const int  WM_IME_CHAR = 0x286;

        public const int  WM_IME_REQUEST = 0x288;

        public const int  WM_IME_KEYDOWN = 0x290;
        public const int  WM_IME_KEYUP = 0x291;

        public const int  WM_MOUSEHOVER = 0x2A1;
        public const int  WM_MOUSELEAVE = 0x2A3;

        public const int  WM_NCMOUSEHOVER = 0x2A0;
        public const int  WM_NCMOUSELEAVE = 0x2A2;

        public const int  WM_WTSSESSION_CHANGE = 0x2B1;

        public const int  WM_TABLET_FIRST = 0x2C0;
        public const int  WM_TABLET_LAST = 0x2DF;

        public const int  WM_DPICHANGED = 0x2E0;

        public const int  WM_CUT = 0x300;
        public const int  WM_COPY = 0x301;
        public const int  WM_PASTE = 0x302;
        public const int  WM_CLEAR = 0x303;
        public const int  WM_UNDO = 0x304;
        public const int  WM_RENDERFORMAT = 0x305;
        public const int  WM_RENDERALLFORMATS = 0x306;
        public const int  WM_DESTROYCLIPBOARD = 0x307;
        public const int  WM_DRAWCLIPBOARD = 0x308;
        public const int  WM_PAINTCLIPBOARD = 0x309;
        public const int  WM_VSCROLLCLIPBOARD = 0x30A;
        public const int  WM_SIZECLIPBOARD = 0x30B;
        public const int  WM_ASKCBFORMATNAME = 0x30C;
        public const int  WM_CHANGECBCHAIN = 0x30D;
        public const int  WM_HSCROLLCLIPBOARD = 0x30E;
        public const int  WM_QUERYNEWPALETTE = 0x30F;
        public const int  WM_PALETTEISCHANGING = 0x310;
        public const int  WM_PALETTECHANGED = 0x311;
        public const int  WM_HOTKEY = 0x312;

        public const int  WM_PRINT = 0x317;
        public const int  WM_PRINTCLIENT = 0x318;

        public const int  WM_APPCOMMAND = 0x319;

        public const int  WM_THEMECHANGED = 0x31A;

        public const int  WM_CLIPBOARDUPDATE = 0x31D;

        public const int  WM_DWMCOMPOSITIONCHANGED = 0x31E;
        public const int  WM_DWMNCRENDERINGCHANGED = 0x31F;
        public const int  WM_DWMCOLORIZATIONCOLORCHANGED = 0x320;
        public const int  WM_DWMWINDOWMAXIMIZEDCHANGE = 0x321;

        public const int  WM_DWMSENDICONICTHUMBNAIL = 0x323;
        public const int  WM_DWMSENDICONICLIVEPREVIEWBITMAP = 0x326;

        public const int  WM_GETTITLEBARINFOEX = 0x33F;

        public const int  WM_HANDHELDFIRST = 0x358;
        public const int  WM_HANDHELDLAST = 0x35F;

        public const int  WM_AFXFIRST = 0x360;
        public const int  WM_AFXLAST = 0x37F;

        public const int  WM_PENWINFIRST = 0x380;
        public const int  WM_PENWINLAST = 0x38F;

        public const int  WM_APP = 0x8000;

        public const int  WM_USER = 0x400;

        public const int  MK_LBUTTON = 0x1;
        public const int  MK_RBUTTON = 0x2;
        public const int  MK_MBUTTON = 0x10;
        public const int  MK_SHIFT = 0x4;
        public const int  MK_CONTROL = 0x8;

        #endregion

        #region Window States

        // SetWindowLongPtr flags.

        public const int GWL_WNDPROC = (-4);
        public const int GWL_STYLE = (-16);
        public const int GWL_EXSTYLE = (-20);

        // Window Creation

        // Window Styles 1

        public const uint WS_OVERLAPPED = 0x0;
        public const uint WS_POPUP = 0x80000000;
        public const uint WS_CHILD = 0x40000000;
        public const uint WS_MINIMIZE = 0x20000000;
        public const uint WS_VISIBLE = 0x10000000;
        public const uint WS_DISABLED = 0x8000000;
        public const uint WS_CLIPSIBLINGS = 0x4000000;
        public const uint WS_CLIPCHILDREN = 0x2000000;
        public const uint WS_MAXIMIZE = 0x1000000;
        public const uint WS_CAPTION = 0xC00000;
        public const uint WS_BORDER = 0x800000;
        public const uint WS_DLGFRAME = 0x400000;
        public const uint WS_VSCROLL = 0x200000;
        public const uint WS_HSCROLL = 0x100000;
        public const uint WS_SYSMENU = 0x80000;
        public const uint WS_THICKFRAME = 0x40000;
        public const uint WS_GROUP = 0x20000;
        public const uint WS_TABSTOP = 0x10000;

        public const uint WS_MINIMIZEBOX = 0x20000;
        public const uint WS_MAXIMIZEBOX = 0x10000;

        public const uint WS_TILED = WS_OVERLAPPED;
        public const uint WS_ICONIC = WS_MINIMIZE;
        public const uint WS_SIZEBOX = WS_THICKFRAME;

        // Window Styles 2

        public const uint WS_OVERLAPPEDWINDOW = (WS_OVERLAPPED + 
                        WS_CAPTION + 
                        WS_SYSMENU + 
                        WS_THICKFRAME + 
                        WS_MINIMIZEBOX + 
                        WS_MAXIMIZEBOX);

        public const uint WS_POPUPWINDOW = (WS_POPUP + 
                        WS_BORDER + 
                        WS_SYSMENU);

        public const uint WS_CHILDWINDOW = (WS_CHILD);

        public const uint WS_TILEDWINDOW = WS_OVERLAPPEDWINDOW;
        //
        // Extended Window Styles
        //
        public const uint WS_EX_DLGMODALFRAME = 0x1;
        public const uint WS_EX_NOPARENTNOTIFY = 0x4;
        public const uint WS_EX_TOPMOST = 0x8;
        public const uint WS_EX_ACCEPTFILES = 0x10;
        public const uint WS_EX_TRANSPARENT = 0x20;

        public const uint WS_EX_MDICHILD = 0x40;
        public const uint WS_EX_TOOLWINDOW = 0x80;
        public const uint WS_EX_WINDOWEDGE = 0x100;
        public const uint WS_EX_CLIENTEDGE = 0x200;
        public const uint WS_EX_CONTEXTHELP = 0x400;

        public const uint WS_EX_RIGHT = 0x1000;
        public const uint WS_EX_LEFT = 0x0;
        public const uint WS_EX_RTLREADING = 0x2000;
        public const uint WS_EX_LTRREADING = 0x0;
        public const uint WS_EX_LEFTSCROLLBAR = 0x4000;
        public const uint WS_EX_RIGHTSCROLLBAR = 0x0;

        public const uint WS_EX_CONTROLPARENT = 0x10000;
        public const uint WS_EX_STATICEDGE = 0x20000;
        public const uint WS_EX_APPWINDOW = 0x40000;

        public const uint WS_EX_OVERLAPPEDWINDOW = (WS_EX_WINDOWEDGE + WS_EX_CLIENTEDGE);
        public const uint WS_EX_PALETTEWINDOW = (WS_EX_WINDOWEDGE + WS_EX_TOOLWINDOW + WS_EX_TOPMOST);

        // Windows 5.0& (2000/Millenium)

        public const uint WS_EX_LAYERED = 0x80000;

        public const uint WS_EX_NOINHERITLAYOUT = 0x100000;  // Disable inheritence of mirroring by children;
        public const uint WS_EX_LAYOUTRTL = 0x400000;        // Right to left mirroring;

        // Windows NT 5.0& (Windows 2000) only

        public const uint WS_EX_NOACTIVATE = 0x8000000;

        public const int SW_HIDE = 0;
        public const int SW_SHOWNORMAL = 1;
        public const int SW_NORMAL = 1;
        public const int SW_SHOWMINIMIZED = 2;
        public const int SW_SHOWMAXIMIZED = 3;
        public const int SW_MAXIMIZE = 3;
        public const int SW_SHOWNOACTIVATE = 4;
        public const int SW_SHOW = 5;
        public const int SW_MINIMIZE = 6;
        public const int SW_SHOWMINNOACTIVE = 7;
        public const int SW_SHOWNA = 8;
        public const int SW_RESTORE = 9;
        public const int SW_SHOWDEFAULT = 10;
        public const int SW_FORCEMINIMIZE = 11;
        public const int SW_MAX = 11;


        #endregion

    }
}
